package com.test38_集合;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;

/**
 * List集合
 */
public class Demo01_List {

    /**
     * List接口
     */
    @Test
    public void test1() {
        {
            List all = Arrays.asList("www.yootk.com", "edu.yootk.com", "yootk.ke.qq.com");
            for (Object obj : all.toArray()) {
                System.out.println("沐言科技：" + obj);
            }
        }
        {
            // JDK1.9支持
            List<String> all = List.of("www.yootk.com", "edu.yootk.com", "yootk.ke.qq.com");
            // 不能对List增删，只能查改
            // all.add("沐言优拓");
            System.out.println(all);
        }
    }

    /**
     * ArrayList
     */
    @Test
    public void test2() {
        List<String> all = new ArrayList<>();
        System.out.printf("【集合未保存数据前的状态】集合长度：%s、是否为空：%s\n", all.size(), all.isEmpty());
        all.add(null);
        all.add("www.yootk.com");
        all.add("edu.yootk.com");
        all.add("yootk.ke.qq.com");
        System.out.printf("【集合未保存数据后的状态】集合长度：%s、是否为空：%s\n", all.size(), all.isEmpty());
        System.out.println(all);
        for (Object obj : all.toArray()) {
            System.out.println(obj);
        }
    }

    @Test
    public void test3() {
        List<Book> all = new ArrayList<>();
        all.add(new Book("Java从入门到项目实战", "李兴华", 99.8));
        all.add(new Book("Python从入门到项目实战", "李兴华", 97.9));
        all.add(new Book("Go从入门到项目实战", "李兴华", 98.6));
        all.forEach(System.out::println);
        System.out.println("---------------------------------");
        // 使用contains和remove，需要重写equals方法
        boolean flag = all.remove(new Book("Go从入门到项目实战", "李兴华", 98.6));
        System.out.println(flag);
        all.forEach(System.out::println);
    }

    /**
     * LinkedList
     */
    @Test
    public void test4() {
        List<String> all = new LinkedList<>();
        all.add(null);
        all.add("www.yootk.com");
        all.add("edu.yootk.com");
        all.add("yootk.ke.qq.com");
        all.forEach(System.out::println);
    }

    /**
     * ArrayList与Vector的区别：
     * 1.都是用了数组的机制实现了数据的存储，
     * 默认开辟的数组大小不同，ArrayList为空数组，Vector默认长度为10；
     * 2.ArrayList类的全部方法为异步处理，Verctor类的全部方法使用了synchronized同步标记，
     * 所以ArrayList属于非线程安全的集合类，而Verctor属于线程安全的集合类；
     * 3.ArrayList是在JDK1.2的时候提供的，而Vector是在JDK1.0的时候提供的。
     */
    @Test
    public void test5() {
        List<String> all = new Vector<>();
        all.add(null);
        all.add("www.yootk.com");
        all.add("edu.yootk.com");
        all.add("yootk.ke.qq.com");
        all.forEach(System.out::println);
    }
}

class Book {
    private String title;
    private String author;
    private double price;

    public Book(String title, String author, double price) {
        this.title = title;
        this.author = author;
        this.price = price;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof Book) {
            Book book = (Book) obj;
            return this.title.equals(book.title) && this.author.equals(book.author) && this.price == book.price;
        }
        return false;
    }

    @Override
    public String toString() {
        return "【Book】图书名称：" + this.title + "、作者：" + this.author + "、价格：" + this.price;
    }
}
